package org.fireflow.service.webservice; import java.net.MalformedURLException; import java.net.URL; import javax.wsdl.Definition; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.ws.Dispatch; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.fireflow.engine.exception.ServiceInvocationException; import org.firesoa.common.schema.DOMInitializer; import org.w3c.dom.Document; public class WebServiceCallerImpl implements WebServiceCaller { private static final Log log = LogFactory.getLog(WebServiceCallerImpl.class); private static final TransformerFactory transformerFactory = TransformerFactory.newInstance(); WebServiceDef ws = null; public void setWebService(WebServiceDef ws){ this.ws = ws; } public WebServiceDef getWebService(){ return ws; } /* public List<Document> callWebService(List<Document> messagePlayload) throws ServiceInvocationException { Definition wsdlDef = ws.getWsdlDefinition(); String targetNsUri = wsdlDef.getTargetNamespace(); QName serviceQName = new QName(targetNsUri,ws.getName()); QName portQName = new QName(targetNsUri,ws.getPortName()); String urlStr = ws.getWsdlURL(); URL url = null; if (urlStr.toLowerCase().startsWith(WebService.CLASSPATH_URL_PREFIX)) { url = WebServiceCallerImpl.class.getResource(urlStr .substring(WebService.CLASSPATH_URL_PREFIX.length())); }else{ try { url = new URL(urlStr); } catch (MalformedURLException e) { throw new ServiceInvocationException(e); } } if (url==null){ throw new ServiceInvocationException("Invalid wsdl url '"+urlStr+"'"); } javax.xml.ws.Service jawsService = javax.xml.ws.Service.create(url, serviceQName); Dispatch<DOMSource> dispatch = jawsService.createDispatch(portQName, DOMSource.class, javax.xml.ws.Service.Mode.PAYLOAD); Document thePayLoad = messagePlayload.get(0);//TODO 待处理 DOMSource request = new DOMSource(thePayLoad); DOMSource response = dispatch.invoke(request); Document theResponsePayload = (Document)response.getNode(); List<Document> result = new ArrayList<Document>(); result.add(theResponsePayload); return result; } */ public Document callWebService(Document messagePlayload) throws ServiceInvocationException { Definition wsdlDef = ws.getWsdlDefinition(); String targetNsUri = wsdlDef.getTargetNamespace(); QName serviceQName = new QName(targetNsUri,ws.getName()); QName portQName = new QName(targetNsUri,ws.getPortName()); String urlStr = ws.getWsdlURL(); URL url = null; if (urlStr.toLowerCase().startsWith(WebServiceDef.CLASSPATH_URL_PREFIX)) { url = WebServiceCallerImpl.class.getResource(urlStr .substring(WebServiceDef.CLASSPATH_URL_PREFIX.length())); }else{ try { url = new URL(urlStr); } catch (MalformedURLException e) { throw new ServiceInvocationException(e); } } if (url==null){ throw new ServiceInvocationException("Invalid wsdl url '"+urlStr+"'"); } javax.xml.ws.Service jawsService = javax.xml.ws.Service.create(url, serviceQName); Dispatch<Source> dispatch = jawsService.createDispatch(portQName, Source.class, javax.xml.ws.Service.Mode.PAYLOAD); DOMSource domSource = new DOMSource(messagePlayload); log.debug("Call web service , servicename="+serviceQName+", portname="+portQName+", the soap message is: \n"); log.debug(DOMInitializer.dom2String(messagePlayload)); Source response = dispatch.invoke(domSource); DOMResult domResult = new DOMResult(); Transformer transformer = null; try { transformer = transformerFactory.newTransformer(); transformer.transform(response, domResult); } catch (TransformerConfigurationException e) { throw new RuntimeException("Couldn't parse response stream.", e); } catch (TransformerException e) { throw new RuntimeException("Couldn't parse response stream.", e); } Document theResponsePayload = (Document)domResult.getNode(); log.debug("The response of the web service is :"); log.debug(DOMInitializer.dom2String(theResponsePayload)); return theResponsePayload; } private URL getURL()throws ServiceInvocationException{ String urlStr = ws.getWsdlURL(); URL url = null; if (urlStr.toLowerCase().startsWith(WebServiceDef.CLASSPATH_URL_PREFIX)) { url = WebServiceCallerImpl.class.getResource(urlStr .substring(WebServiceDef.CLASSPATH_URL_PREFIX.length())); }else{ try { url = new URL(urlStr); } catch (MalformedURLException e) { throw new ServiceInvocationException(e); } } if (url==null){ throw new ServiceInvocationException("Invalid wsdl url '"+urlStr+"'"); } return url; } }